package model

import (
	"fmt"
	"gitee.com/liumou_site/gns/ip"
	"gitee.com/liumou_site/logger"
	"strings"
)

// GetIp 获取IP地址信息
// 该函数会依次调用getIp6和getIp4方法，分别获取IPv6和IPv4地址信息。
// 该函数没有参数和返回值。
func (i *IP) GetIp() {
	// 获取IPv6地址信息
	i.getIp6()
	// 获取IPv4地址信息
	i.getIp4()
}

// getIp4 方法用于获取并设置IPv4地址信息
func (i *IP) getIp4() {
	// 检查IP类型是否为"A"或"ALL"，如果不是则直接返回
	if strings.EqualFold(i.IpType, "A") || strings.EqualFold(i.IpType, "ALL") {
		if i.Debug {
			logger.Debug("正在获取ipv4地址")
		}
	} else {
		return
	}
	// 初始化Ip4Exists为false，表示尚未获取到IPv4地址
	i.Ip4Exists = false
	// 从指定API获取IPv4地址
	ipv4, err := ip.GetPublicIpv4()
	// 如果获取过程中发生错误，记录错误信息并返回
	if err != nil {
		i.Err = err
		return
	}
	// 清除之前的错误信息
	i.Err = nil
	// 设置获取到的IPv4地址
	i.IP4 = ipv4
	// 设置Ip4Exists为true，表示已成功获取IPv4地址
	i.Ip4Exists = true
}

// getIp6尝试获取IPv6地址，并根据条件更新实例的相应字段。
// 此函数首先检查实例的IpType是否为"AAAA"或"ALL"，如果是，则尝试获取IPv6地址。
// 如果SetV6被设置为true，表示正在获取IPv6地址。
// 如果获取IPv6地址成功，更新Ip、IP6字段，并将Ip6Exists设置为true。
// 如果获取IPv6地址失败或IpType不符合条件，则不进行任何操作并直接返回。
func (i *IP) getIp6() {
	// 初始化Ip6Exists为false，表示尚未获取到IPv6地址
	i.Ip6Exists = false

	// 检查IP类型是否为"AAAA"或"ALL"，如果不是则直接返回
	if strings.EqualFold(i.IpType, "AAAA") || strings.EqualFold(i.IpType, "ALL") {
		if i.Debug {
			logger.Debug("正在获取ipv6地址")
		}
	} else {
		return
	}

	// 设置SetV6为true，表示正在获取IPv6地址
	i.SetV6 = true

	// 根据是否指定了网络接口来获取IPv6地址
	v6, err := ip.GetPublicIpv6()
	if i.SpecifyNetworkCard {
		v6, err = ip.GetPublicIpv6Eth(i.SpecifyNetworkCardName)
	}
	if err != nil {
		i.Err = err
		return
	}
	// 如果成功获取到IPv6地址，则更新相关字段
	if len(v6) == 0 {
		i.Err = fmt.Errorf("获取到的IPV6地址为空")
		return
	}
	i.Ip = string(v6[0])
	i.IP6 = i.Ip
	i.Err = nil
	i.Ip6Exists = true
	if i.Debug {
		logger.Debug("通过正则匹配IPV6地址成功", i.Ip)
	}
}
